package frameTest.frameContent;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/*
        事件监听:事件源.监听方法(实现类对象),通过实现对应接口,重写对应方法,达成想要的效果

        ActionListener:只能监听鼠标点击,空格按下
        keyListener:监听键盘操作
        事件冲突:以上两种监听同时使用,可能存在冲突,
                  使用setFocusAble(false);取消按钮的焦点

        适配器模式解决问题:有些实现类并不需要接口中所有的方法,但不得不重写方法
             步骤:1.创建一个抽象(abstract)类实现接口,重写所有方法,方法空实现
                 2.继承这个抽象类,重写需要的方法
        模板模式: 把抽象类当作一个模板,其中不能决定的部分定义为抽象方法,不希望被修改的部分用final修饰

 */
public class ActionAndKeyListenerTest extends KeyListenerAdapt{
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        frame.setSize(900,900);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLayout(null);
        getActionListener(frame);
        getKeyListener(frame);


        frame.setVisible(true);
    }
        //键盘监听-无模式
    private static void getKeyListener(JFrame frame) {
        frame.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {
                int count=e.getKeyCode();
                  if (count==65){
                      System.out.println("a");
                  }else if (count==87){
                      System.out.println("w");
                  }else if (count==68){
                      System.out.println("d");
                  }else if (count==83){
                      System.out.println("s");
                  }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }
        });
    }
    //键盘监听-适配器模式
    private static void getKeyListenerAdapt(JFrame frame) {
          //不在直接实现接口,继承一个实现接口的适配类,重写需要的方法
         frame.addKeyListener(new KeyListenerAdapt() {
            @Override
            public void keyPressed(KeyEvent e) {
                int count=e.getKeyCode();
                if (count==65){
                    System.out.println("a");
                }else if (count==87){
                    System.out.println("w");
                }else if (count==68){
                    System.out.println("d");
                }else if (count==83){
                    System.out.println("s");
                }
            }
        });
    }
    //动作监听
    private static void getActionListener(JFrame frame) {
        JButton button=new JButton("点我");
        button.setBounds(500,500,100,100);
        //取消按钮的焦点,解决监听中的冲突
        button.setFocusable(false);
        frame.getContentPane().add(button);
        //事件源    监听方法(监听鼠标点击,按下空格)    实现类对象:执行操作,通过重写接口的方法,达成自己想要的效果
           button  .  addActionListener      (new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("我被点了");
            }
        });
    }
}
abstract class KeyListenerAdapt implements KeyListener{

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}
//模板模式
 abstract class  Module{
    public final void writr(){
        System.out.println("start");//开头和结尾固定
        body();
        System.out.println("end");
    }
    abstract void body();
 }